package jp.tkym.labs.m3d;

import jp.tkym.labs.geom.Vector3f;

/**
 * Device Coordinate Translator
 * 
 * @author takayama
 */
public class DeviceTranslator {
	private int widthOfDevice;
	private int heightOfDevice;

	public DeviceTranslator(int width, int height) {
		this.widthOfDevice = width;
		this.heightOfDevice = height;
	}

	void setDeviceSize(int width, int height) {
		this.widthOfDevice = width;
		this.heightOfDevice = height;
	}

	Vector3f translate(Vector3f v3f) {
		return new Vector3f((float) (v3f.x + 0.5d) * widthOfDevice,
				(float) (v3f.y + 0.5d) * heightOfDevice, 0.0f);
	}
}
//
// /**
// * <p>WorldCoodinate</p>
// * <p>3DモデルのWorld座標系を指定します。</p>
// * <p></p>
// * @author FJ)高山 2009/04/03
// * @version
// */
// public class WorldCoodinate extends CoodinateComposite {
//
// private double width = 0;
// private double height = 0;
// private double distance = 0;
//
// /**
// * コンストラクタです。
// */
// public WorldCoodinate(){
// this("WORLD");
// }
//
//
// private WorldCoodinate(String id) {
// super(id);
// }
//
// /**
// * View座標系のサイズを指定します。
// * @param width
// * @param height
// */
// public void setViewSize(double width, double height){
// this.width = width;
// this.height = height;
// }
//
// /**
// * View座標系の距離を指定します。
// * @param distance
// */
// public void setViewDistance(double distance){
// this.distance = distance;
// }
//
// /**
// * ローカル座標系からDevice座標系までのアフィン変換行列を取得します。
// * @param id
// * @return AffineTransform
// */
// public AffineTransform getAffineTransform(String id){
// CoodinateComposite co = getComposite(id);
// if(co != null){
// Vector3D m_x = new Vector3D(1,0,0);
// Vector3D m_y = new Vector3D(0,1,0);
// Vector3D m_0 = new Vector3D(0,0,0);
// Vector3D w_x = co.translateWorldCoordinate(m_x);
// Vector3D w_y = co.translateWorldCoordinate(m_y);
// Vector3D w_0 = co.translateWorldCoordinate(m_0);
// Vector3D v = viewPosition();
// Vector3D d_x = transform(w_x, v);
// Vector3D d_y = transform(w_y, v);
// Vector3D d_0 = transform(w_0, v);
// double m00 = d_x.x - d_0.x;
// double m01 = d_y.x - d_0.x;
// double m02 = d_0.x;
// double m10 = d_x.y - d_0.y;
// double m11 = d_y.y - d_0.y;
// double m12 = d_0.y;
// return new AffineTransform(m00, m10, m01, m11, m02, m12);
// }else{
// return null;
// }
// }
//
// /**
// * ローカル座標系による3次元位置をデバイス座標系の2次元位置に変換します。
// * @param id
// * @param p
// * @return Point
// */
// public Point getDevicePoint(String id, Vector3D p){
// CoodinateComposite co = getComposite(id);
// if(co != null){
// // World座標系に変換
// Vector3D w = co.translateWorldCoordinate(p);
// Vector3D d = transform(w, viewPosition());
// // 整数変換
// int x = new Double(d.x).intValue();
// int y = new Double(d.y).intValue();
// return new Point(x , y);
//
// }else{
// return null;
// }
// }
//
// private Vector3D viewPosition(){
// Vector3D p = new Vector3D();
// p.x = width / 2;
// p.y = height / 2;
// p.z = -distance;
// return p;
// }
//
// /**
// *
// * @param id
// * @param comp
// * @return
// */
// public Rectangle createRectangle(String id, Rectangle comp){
// AffineTransform tm = getAffineTransform(id);
// return createRectangleFromAffine(tm ,comp);
// }
//
// /**
// *
// * @param pos
// * @param view
// * @return
// */
// private static Vector3D transform(Vector3D pos, Vector3D view){
// // view座標系に変換
// Vector3D v = pos.subtract(view);
// // 透視投影
// double r = Math.abs(view.z / v.z);
// Vector3D p = new Vector3D(v.x * r, v.y * r, 0);
// // デバイス座標変換
// return new Vector3D(p.x+view.x, p.y+view.y,0);
// }
//
// /**
// * 座標軸を取得するメソッドです。
// * @param id
// * @return
// */
// public CoodinateComposite get(String id){
// if(id.equals(this.getId())){
// return this;
// }else{
// return super.getComposite(id);
// }
// }
//
// /**
// * 奥行きにより画像を薄くする計算です。
// */
// public float getAlphaComposite(String id){
// float alpha;
// alpha = (float)(getAffineTransform(id).getScaleX() * 3.0 - 1.0);
// if(alpha > 1.0){
// alpha = 1.0f;
// }else if(alpha < 0){
// alpha = 0.0f;
// }
// return alpha;
// }
//
//
// /**
// * AffineTransformからコンポーネントの矩形を計算します。
// * @param tm
// * @param comp
// * @return
// */
// private static Rectangle createRectangleFromAffine(AffineTransform tm,
// Rectangle comp){
// int r_x = new Double(tm.getTranslateX()).intValue();
// int r_y = new Double(tm.getTranslateY()).intValue();
// int r_w = new Double(comp.width * tm.getScaleX()).intValue();
// int r_h = new Double(comp.height * tm.getScaleY()).intValue();
//
// //座標変換による描画領域計算
// return new Rectangle(r_x, r_y, r_w, r_h);
// }
//
//
// /**
// * 簡易的な陰面処理を行います。
// * @param child
// * @param range
// * @return Rectangle
// */
// public static Rectangle adjustRangeRectangle(Rectangle comp, Rectangle
// range){
// Rectangle sub = comp.intersection(range);
// if(range.contains(sub)){
// if(range.x + range.width == sub.x + sub.width){
// range.width = sub.x - range.x;
// }
// if(range.y + range.height == sub.y + sub.height){
// range.height = sub.y - range.y;
// }
// if(range.x == sub.x){
// range.x = sub.x + sub.width;
// }
// if(range.y == sub.y){
// range.y = sub.y + sub.height;
// }
// }
// return sub;
// }
//
// /**
// * Z Buffer方式による陰面処理
// * @param comp
// * @param zBuffer
// * @return Rectangle
// */
// public static Rectangle adjustRangeZBuffer(Rectangle comp,
// Collection<Rectangle> zBuffer){
// Iterator<Rectangle> ite = zBuffer.iterator();
// while(ite.hasNext()){
// if(((Rectangle)ite.next()).contains(comp)){
// comp.width = 0;
// comp.height = 0;
// }
// }
// zBuffer.add(comp);
// return comp;
// }
// }